/* eslint valid-jsdoc: "off" */

/**
 * @param {Egg.EggAppInfo} appInfo app info
 */

const path = require("path"); // 在配置文件顶部添加

module.exports = (appInfo) => {
  /**
   * built-in config
   * @type {Egg.EggAppConfig}
   **/
  const config = (exports = {});

  // use for cookie sign key, should change to your own and keep security
  config.keys = appInfo.name + "_1749284081675_1998";

  config.passportGithub = {
    key: "a",
    secret: "b",
    // callbackURL: '/passport/github/callback',
    // proxy: false,
  };

  // add your middleware config here
  config.middleware = ["verifyToken"];

  config.onerror = {
    // 统一错误处理配置
    all(err, ctx) {
      // 记录错误日志
      ctx.logger.error("[Global Error]", err);

      // 返回标准化的错误响应
      ctx.status = err.status || 500;
      ctx.body = {
        code: ctx.status,
        message:
          ctx.app.config.env === "prod" ? "Internal Server Error" : err.message,
        data: null,
        stack: ctx.app.config.env === "local" ? err.stack : undefined,
      };
    },
  };

  config.jwt = {
    secret: "weining_secret_key", // JWT 密钥
    enable: false,
    // 是否开启 JWT 功能
    ignore: [
      "/api/login",
      "/api/upload/image",
      "/api/upload/editorImage",
      "/api/upload/image/:filename",
    ], // 不需要验证的路由列表
    // 这些路由不需要验证 JWT Token，可以根据实际情况调整
    // 例如：["/api/login", "/api/register", "/api/public"]
    // 注意：如果你使用了 egg-jwt 插件，这里配置的 ignore 会被合并到插件的默认配置中
    // 所以在使用时，调用 jwt.sign(payload, secret, { expiresIn: number }) 时，
    // 如果设置了 expiresIn，优先级会更高。
    // 例如：jwt.sign({ id: user.id }, app.config.jwt.secret, { expiresIn: '1h' })
    // 这样可以覆盖默认的过期时间设置。
    // 这里的配置会影响到 jwt.sign 方法的默认行为。
    sign: {
      // jwt.sign(***,***,[options,***])方法中，options的默认设置可以在这里配置；
      // 过期时间24小时
      // expiresIn: 24 * (60 * 60), // 多少s后过期。actionToken.js中,jwt.sing(plyload,secret,{expiresIn:number})会被合并，调用时设置优先级更高;
    },
  };

  // error handler middleware config
  // config.errorHandler = {
  //   match: "/api", // only match API routes
  // };

  // add your user config here
  const userConfig = {
    // myAppName: 'egg',
  };

  // config.mysql = {
  //   // 单数据库信息配置
  //   client: {
  //     // host
  //     host: "localhost",
  //     // 端口号
  //     port: "3306",
  //     // 用户名
  //     user: "root",
  //     // 密码
  //     password: "123456",
  //     // 数据库名
  //     database: "eggjsdb",
  //   },
  //   // 是否加载到 app 上，默认开启
  //   app: true,
  //   // 是否加载到 agent 上，默认关闭
  //   agent: false,
  // };

  config.sequelize = {
    dialect: "mysql",
    host: "localhost",
    port: 3306,
    // 用户名
    user: "root",
    // 密码
    password: "123456",
    database: "eggjsdb",
  };

  config.security = {
    csrf: {
      // 关闭 CSRF 保护（不推荐生产环境使用）
      enable: false,
    },
  };

  config.oss = {
    client: {
      accessKeyId: "LTAI5t676dHUsq1HQcHKkJgB",
      accessKeySecret: "q8iYcBDYkR9O3c8Hegj0opq8GhspWt",
      bucket: "app-images-beijing",
      endpoint: "oss-cn-beijing.aliyuncs.com",
      secure: true,
      timeout: "60s",
    },
  };

  config.multipart = {
    mode: "file", // 使用文件模式
    fileSize: "10mb", // 最大文件大小
    whitelist: [".jpg", ".jpeg", ".png", ".gif", ".webp"], // 允许的扩展名
  };

  config.static = {
    prefix: "/public", // 静态资源访问前缀
    dir: path.join(appInfo.baseDir, "app/public"), // 静态资源目录
    dynamic: true, // 动态加载静态资源
  };

  config.bodyParser = {
    jsonLimit: "10mb",
    formLimit: "10mb",
  };

  config.redis = {
    client: {
      port: 6379, // Redis 端口
      host: "127.0.0.1", // Redis 主机
      password: "", // Redis 密码，没有则留空
      db: 0, // 默认使用的数据库
    },
    // 缓存时间（单位：秒）
    categoryCacheTime: 60 * 60 * 24, // 24小时
  };

  // 分布式锁配置
  config.lock = {
    // 锁过期时间（秒）
    expire: 10,
  };

  // Redis 缓存时间配置（秒）
  config.cache = {
    categoryTree: 3600, // 分类树缓存 1 小时
    hotProducts: 300, // 热门商品缓存 5 分钟
    newProducts: 300, // 新品缓存 5 分钟
    recommendProducts: 300, // 推荐商品缓存 5 分钟
    productDetail: 300, // 商品详情缓存 5 分钟
  };

  return {
    ...config,
    ...userConfig,
  };
};
